package ch07 {
	/**
	   设置消失点
	   Flash 10 3D自动地为你设定消失点设定为舞台的中心.但是它只会在 SWF加载的时候运行一次.当你测试Flash影片的时候,消失点将被放在文件属性面板的基本窗口里.所以消失点在中心,效果也很好。
	   但是，在 Flex Builder里, 默认 SWF的大小为 500*375 像素。因此，你要将消失点设置在(250,187.5)。但是当你设置舞台靠左上角对齐，元素无缩放
	   (Stage.align=StageAlign.TOP_LEFT,Stage.scaleMode=StageScaleMode.NO_SCALE)，它将会改变舞台的大小。(一种普遍的做法都是这样设置，让SWF里有所有元素不随着它的比例变化而改变，只是缩放舞台的大小)。你可以用 trace来输出设置舞台对齐方式和缩放模式前和设置后舞台的宽和高:
	   trace(stage.stageWidth, stage.stageHeight);// 500,375
	   stage.align = StageAlign.TOP_LEFT;
	   stage.scaleMode = StageScaleMode.NO_SCALE;
	   trace(stage.stageWidth, stage.stageHeight); // 1440, 794
	   最后一个输出你将得到不同的值，这个只依赖于你窗口的大小。所以，舞台的大小变了，sprite也被重新设置在舞台的新中心点，比如说这个就是（720，397）。但是消失点还是在点（250，187.5）。这是一个问题。
	   设置舞台的宽和高最简单的方法就是直接在你 SWF的元数据里设置：
	   [SWF(backgroundColor=0xffffff, width=800, height=800)]
	   这个将会在消失点之前运行，所以它会按(800,800)的中心点去计算。当设置了对齐方式和缩放模式，舞台的大小将不会改变，同样你的 sprite也会被固定在同一个中心。

	   如果你想为影片中的所有元素设置消失点，可以在 root 上设置，像这样：
	   root.transform.perspectiveProjection.projectionCenter =New Point(stage.stageWidth / 2,fstage.stageHeight / 2);
	 * @author jianping.shenjp
	 */
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.PerspectiveProjection;
	import flash.geom.Point;

	[SWF(backgroundColor=0xffff00,width=500,height=500)]
	public class Test3D extends Sprite {
		private var _contoiner:Sprite;
		private var _shape:Shape;

		public function Test3D(){
			trace("stage:", stage.stageWidth, stage.stageHeight);
			trace("projectionCenter:", this.transform.perspectiveProjection.projectionCenter);
			//监听RESIZE时间，无论舞台的大小如何变化都可以正确改变消失点 。
			stage.addEventListener(Event.RESIZE, resizeHandler);
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			_contoiner = new Sprite();
			addChild(_contoiner);
			
			_shape = new Shape();
			_shape.graphics.beginFill(0xff0000);
			_shape.graphics.drawRect(-100, -100, 200, 200);
			_shape.x = stage.stageWidth / 2;
			_shape.y = stage.stageHeight / 2;
			_contoiner.addChild(_shape);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);

			//改变消失点
			root.transform.perspectiveProjection.projectionCenter = new Point(stage.stageWidth, stage.stageHeight);
			//trace("projectionCenter:",_contoiner.transform.perspectiveProjection.projectionCenter);
			trace("stage:", stage.stageWidth, stage.stageHeight);
			trace("projectionCenter:", this.transform.perspectiveProjection.projectionCenter);
		}

		private function resizeHandler(e:Event):void {
		
			root.transform.perspectiveProjection.projectionCenter = new Point(stage.stageWidth / 2, stage.stageHeight / 2);
				trace("resizeHandler...",this.transform.perspectiveProjection.projectionCenter);
			if (_shape){
				_shape.x = stage.stageWidth / 2;
				_shape.y = stage.stageHeight / 2;
			}
		}


		private function onEnterFrame(event:Event):void {
			_shape.rotationY += 2;
		}
	}

}